<template>
<!-- 组织架构 -->
  <div v-loading="loading" class="dashboard-container">  
    <div class="app-container">
      <el-card class="tree-card">
        <!-- 行列布局 el-row代表一行，el-col代表一列 ，一行可以有很多列，行和列整体分部不能超过24 如果有10行 那么就可以有14列  -->
        <TreeTools :node-data="titleData"  @on-open="toggleAddBox"/>
        <!-- 树形菜单 -->
          <el-tree :data="departs" :props="defaultProps">
          <!-- 中间的代码就是插槽内容，用于定制每一行的布局效果 -->
          <template v-slot="scope">
           <TreeTools :node-data="scope.data" @on-open="toggleAddBox" @on-success="onSuccess" /> 
          </template>
        </el-tree>
      </el-card>
    </div>
    <!-- 添加部门 -->
    <!-- 在组件上定义的自定义事件中，$event表示子组件传递的数据，而不是事件对象 -->
    <!-- <AddDept :is-show-dept="isShowDept" @on-close="isShowDept=$event" /> -->
    <!-- <AddDept :is-show-dept="isShowDept" @on-close="toggleAddBox" /> -->
    <!-- .sync修饰符作用：实现父子传值的双向绑定 -->
      <AddDept :operate-flag="operateFlag" :dept-id="currentDeptId" :dlist="dlist" :is-show-dept.sync="isShowDept" @on-success="onSuccess"  />
  </div>
</template>

<script>
import TreeTools from './components/TreeTools.vue'
//引入封装好的api
import {reqGetDepartments} from '@/api/departments'
//添加部门组件
import AddDept from './components/AddDept.vue'

export default {
  name: 'Departments',
  components: {
    TreeTools,AddDept
  },
  data() {       
    return {
      // 加载状态
      loading: false,
      // 操作状态：编辑或者添加
      operateFlag: '',
       // 当前部门id
      currentDeptId: "-1",
      // 控制添加部门弹窗的显示和隐藏
      isShowDept: false,
      
      // 标题
      titleData: {
        name: '江苏传智播客教育科技股份有限公司1',
        manager: '负责人',
        root: true,
        id:''//注意 一级部门的id为空
      },
      // 部门列表的原始数据：普通数组
      dlist: [],
      departs: [
        {
          name: '总裁办',
          manager: '曹操',
          children: [{ name: '董事会', manager: '曹丕' }]
        },
        { name: '行政部', manager: '刘备' },
        { name: '人事部', manager: '孙权' }
      ],
      defaultProps: {
        label: 'name',
        children: 'children'
      },      
    }
  },
  created(){
    this.loadDepartmentList()
  },
  //获取列表  原始的数组转换为树形结构
  methods: {
    // 控制添加部门的弹窗的打开和关闭
    toggleAddBox (infor) {
      this.currentDeptId = infor.id
      this.operateFlag = infor.type
      this.isShowDept = true
    },
    // 删除成功的回调
    onSuccess () {
      this.loadDepartmentsList()
    },
    //把普通数组转化为树形结构的数据 递归
    translateListToTreeData(list,id){
     const result=[]
     list.forEach(item =>{
      if(item.pid === id){
        const children=this.translateListToTreeData(list,item.id)
          if (children && children.length > 0){
          item.children=children
          }
          result.push(item)
      }
     })
     // 返回值表示整个转化后的树形结构
      return result
    },

    //加载部门列表数据
    async loadDepartmentList(){
      try{
        const res= await reqGetDepartments()
          if(res.code===10000){
            // 把后端获取到的原始的部门列表数据传递给【转换函数】，返回最终的树形结构的数据
            this.departs = this.translateListToTreeData(res.data.depts,'')
            this.titleData.name=res.data.companyName
          }
      }catch(e){
        this.$message.error("获取组织结构失败")
      }finally {
        this.loading = false //成功或失败都加载loading
      }
    },
  },
}
</script>

<style scoped>
.tree-card {
  padding: 30px 30px;
  font-size:14px;
}
</style>